package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.RedisConstant;
import com.itheima.dao.CheckGroupDao;
import com.itheima.dao.CheckItemDao;
import com.itheima.dao.SetMealDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.Setmeal;
import com.itheima.service.SetMealService;
import com.alibaba.dubbo.config.annotation.Service;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = SetMealService.class)
@Transactional
public class SetMealServiceImpl implements SetMealService {

    @Autowired
    private SetMealDao setMealDao;

    @Autowired
    private JedisPool jedisPool;

    //从spring容器中获取到freeMarkerConfigurer对象
    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;

    //获取到静态页面的保存位置
    @Value("${out_put_path}")
    private String outPutPath;

    //添加操作
    @Override
    public void add(Setmeal setmeal, Integer[] checkgroupIds) {
        //基本信息添加操作
        setMealDao.add(setmeal);
        //将添加成功的img图片名称上传到Redis中
        Jedis resource = jedisPool.getResource();
        resource.sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES,setmeal.getImg());
        //jedis需要去手动归还到连接池
        resource.close();
        //添加检查套餐与检查组的关系
        if (checkgroupIds != null && checkgroupIds.length > 0){
            for (Integer checkgroupId : checkgroupIds) {
                //创建map对象进行封装
                Map map = new HashMap();
                map.put("setmealId",setmeal.getId());
                map.put("checkgroupId",checkgroupId);
                setMealDao.setSetmealAndCheckGroup(map);
            }
        }
        //添加之后创建或更新静态页面
        generateMobileStaticHtml();
    }


    //分页查询
    @Override
    public PageResult findByPage(QueryPageBean queryPageBean) {
        //获取到数据
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();
        //使用插件进行分页
        PageHelper.startPage(currentPage,pageSize);
        //调用方法
        Page<Setmeal> page = setMealDao.findByPage(queryString);
        return new PageResult(page.getTotal(),page.getResult());
    }

    //删除操作
    @Override
    public void deleteById(Integer setMealId) {
        //根据id进行查询获取到对应的img
        Setmeal setmeal = setMealDao.findById(setMealId);
        //通过jedis进行删除redis中的缓存信息
        Jedis resource = jedisPool.getResource();
        resource.srem(RedisConstant.SETMEAL_PIC_DB_RESOURCES,setmeal.getImg());
        resource.close();
        //根据setMealId删除关联表的数据
        setMealDao.deleteBySetMealId(setMealId);
        //删除基础数据
        setMealDao.delete(setMealId);


        //删除之后创建或更新静态页面
        generateMobileStaticHtml();
    }


    //查询对应的关系
    @Override
    public List<Integer> findByIdForCheckGroup(Integer setMealId) {
        return setMealDao.findByIdForCheckGroup(setMealId);
    }

    //修改操作
    @Override
    public void edit(Setmeal setmeal, Integer[] checkgroupIds) {
        //基本数据修改操作
        setMealDao.edit(setmeal);
        //将图片的信息保存到Redis中
        jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES,setmeal.getImg());
        //删除对应的关联数据信息
        setMealDao.deleteBySetMealId(setmeal.getId());
        //添加检查套餐与检查组的关系
        if (checkgroupIds != null && checkgroupIds.length > 0){
            for (Integer checkgroupId : checkgroupIds) {
                //创建map对象进行封装
                Map map = new HashMap();
                map.put("setmealId",setmeal.getId());
                map.put("checkgroupId",checkgroupId);
                setMealDao.setSetmealAndCheckGroup(map);
            }
        }

        //修改之后创建或更新静态页面
        generateMobileStaticHtml();
    }

    //查询全部
    @Override
    public List<Setmeal> getAllSetMeal() {
        return setMealDao.getAllSetMeal();
    }


    @Autowired
    private CheckGroupDao checkGroupDao;
    @Autowired
    private CheckItemDao checkItemDao;

    //根据套餐id进行查询操作
    @Override
    public Setmeal findById(Integer setMealId) {
        //获取到对应的
        Setmeal setmeal = setMealDao.findById(setMealId);
        //根据体检套餐id查询对应的体检组数据
        List<CheckGroup> checkGroups = checkGroupDao.findAllBySetMealId(setMealId);
        //进行遍历
        for (CheckGroup checkGroup : checkGroups) {
            //根据体检组id来查询对应的体检项数据
            List<CheckItem> checkItems = checkItemDao.findAllByCheckGroupId(checkGroup.getId());
            checkGroup.setCheckItems(checkItems);
        }
        setmeal.setCheckGroups(checkGroups);
        return setmeal;
    }


    private void generateMobileStaticHtml() {
        //获取到数据库中的所有套餐数据
        List<Setmeal> list = setMealDao.getAllSetMeal();

        //创建或更新套餐列表静态页面
        generateMobileSetmealListHtml(list);

        //创建或更新套餐详情静态页面
        generateMobileSetmealDetailHtml(list);
    }

    //套餐详情静态页面生成
    private void generateMobileSetmealDetailHtml(List<Setmeal> list) {
        for (Setmeal setmeal : list) {

            Setmeal setmeal1 = this.findById(setmeal.getId());

            Map map = new HashMap();
            map.put("setmeal",setmeal1);
            //调用方法生成静态页面
            generateHtml("mobile_setmeal_detail.ftl","setmeal_detail_"+setmeal.getId()+".html",map);
        }
    }

    //套餐列表静态页面生成
    private void generateMobileSetmealListHtml(List<Setmeal> list) {
        //将数据进行封装
        Map map = new HashMap();
        map.put("setmealList",list);
        //调用方法生成静态页面
        generateHtml("mobile_setmeal.ftl","m_setmeal.html",map);
    }

    //生成静态页面的方法
    //templateName：所需要使用的模块名称
    //htmlPageName：创建的静态页面的名称
    //map：静态页面所需要的数据
    private void generateHtml(String templateName,String htmlPageName,Map map){
        //获取到对象
        freemarker.template.Configuration configuration = freeMarkerConfigurer.getConfiguration();
        //创建流对象
        Writer out = null;
        try {
            //加载模块数据，获取到模块对象
            Template template = configuration.getTemplate(templateName);
            //创建流对象
            out = new FileWriter(new File(outPutPath + "/" + htmlPageName));
            //创建静态文件
            template.process(map,out);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (out != null){
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }



    //获取到对应的套餐数据
    @Override
    public List<Map<String, Object>> findSetmealCount() {
        List<Map<String,Object>> list = setMealDao.findSetmealCount();
        return list;
    }
}
